#!/usr/bin/env node

/**
 * 数据收集脚本
 * 用于抓取 Ant Design、Ant Design Pro 和 Pro Components 的最新数据
 */

import { DatabaseManager } from '../src/database/DatabaseManager.js';
import { DataCollector, type CollectorConfig } from '../src/scrapers/DataCollector.js';

// 解析命令行参数
function parseArgs(): CollectorConfig & { help?: boolean } {
  const args = process.argv.slice(2);
  const config: CollectorConfig & { help?: boolean } = {
    enableAntDesign: true,
    enableAntDesignPro: true,
    enableProComponents: true,
    enableAntDesignCharts: true,
    useUniversalScraper: false, // 默认使用传统模式
    batchSize: 50,
    maxRetries: 3,
    retryDelay: 2000,
    clearExistingData: false,
    enableIncrementalUpdate: true,
    forceUpdate: false,
  };

  for (let i = 0; i < args.length; i++) {
    const arg = args[i];
    
    switch (arg) {
      case '--help':
      case '-h':
        config.help = true;
        break;
      case '--clear':
      case '-c':
        config.clearExistingData = true;
        break;
      case '--force':
      case '-f':
        config.forceUpdate = true;
        break;
      case '--no-incremental':
        config.enableIncrementalUpdate = false;
        break;
      case '--no-antd':
        config.enableAntDesign = false;
        break;
      case '--no-pro':
        config.enableAntDesignPro = false;
        break;
      case '--no-pro-components':
        config.enableProComponents = false;
        break;
      case '--no-charts':
        config.enableAntDesignCharts = false;
        break;
      case '--universal':
        config.useUniversalScraper = true;
        break;
      case '--legacy':
        config.useUniversalScraper = false;
        break;
      case '--sources':
        if (i + 1 < args.length) {
          config.enabledDataSources = args[++i].split(',');
        }
        break;
      case '--batch-size':
        if (i + 1 < args.length) {
          config.batchSize = parseInt(args[++i], 10) || 50;
        }
        break;
      case '--retries':
        if (i + 1 < args.length) {
          config.maxRetries = parseInt(args[++i], 10) || 3;
        }
        break;
      default:
        console.warn(`未知参数: ${arg}`);
        break;
    }
  }

  return config;
}

// 显示帮助信息
function showHelp(): void {
  console.log(`
数据收集脚本 - Ant Design 生态系统数据抓取工具

用法:
  npm run collect-data [选项]

选项:
  -h, --help              显示帮助信息
  -c, --clear             清理现有数据后重新收集
  -f, --force             强制更新所有数据（忽略增量检查）
  --no-incremental        禁用增量更新（总是重新创建）
  --no-antd               不收集 Ant Design 组件数据
  --no-pro                不收集 Ant Design Pro 模板数据  
  --no-pro-components     不收集 Pro Components 组件数据
  --no-charts             不收集 Ant Design Charts 图表数据
  --universal             使用通用抓取器模式（推荐）
  --legacy                使用传统抓取器模式
  --sources <ids>         指定数据源 ID（逗号分隔）
  --batch-size <数字>      批处理大小 (默认: 50)
  --retries <数字>         重试次数 (默认: 3)

示例:
  npm run collect-data                          # 增量收集所有数据（传统模式）
  npm run collect-data --universal              # 使用通用抓取器模式（推荐）
  npm run collect-data --clear                  # 清理并重新收集所有数据
  npm run collect-data --force                  # 强制更新所有数据
  npm run collect-data --no-pro                 # 只收集 Ant Design、Pro Components 和 Charts
  npm run collect-data --no-charts              # 不收集 Charts 数据
  npm run collect-data --sources ant-design,ant-design-charts  # 指定数据源
  npm run collect-data --no-incremental         # 禁用增量更新
  npm run collect-data --batch-size 100         # 设置批处理大小为 100

环境变量:
  NODE_ENV=production                     # 使用生产环境数据库配置
`);
}

// 格式化进度显示
function formatProgress(progress: any): string {
  const percentage = Math.round((progress.current / progress.total) * 100);
  const bar = '█'.repeat(Math.round(percentage / 5)) + '░'.repeat(20 - Math.round(percentage / 5));
  
  return `${bar} ${percentage}% | ${progress.stage}: ${progress.message || progress.currentTask || ''}`;
}

// 主函数
async function main() {
  const config = parseArgs();

  if (config.help) {
    showHelp();
    return;
  }

  console.log('🚀 启动数据收集任务...\n');

  let dbManager: DatabaseManager | null = null;
  let collector: DataCollector | null = null;

  try {
    // 1. 初始化数据库
    console.log('📊 初始化数据库连接...');
    dbManager = new DatabaseManager();
    await dbManager.initialize();
    console.log('✅ 数据库连接成功\n');

    // 2. 创建数据收集器
    console.log('🔧 配置数据收集器...');
    console.log(`  - Ant Design 组件: ${config.enableAntDesign ? '✅' : '❌'}`);
    console.log(`  - Ant Design Pro 模板: ${config.enableAntDesignPro ? '✅' : '❌'}`);
    console.log(`  - Pro Components: ${config.enableProComponents ? '✅' : '❌'}`);
    console.log(`  - Ant Design Charts: ${config.enableAntDesignCharts ? '✅' : '❌'}`);
    console.log(`  - 抓取器模式: ${config.useUniversalScraper ? '通用模式' : '传统模式'}`);
    if (config.enabledDataSources) {
      console.log(`  - 指定数据源: ${config.enabledDataSources.join(', ')}`);
    }
    console.log(`  - 清理现有数据: ${config.clearExistingData ? '✅' : '❌'}`);
    console.log(`  - 增量更新: ${config.enableIncrementalUpdate ? '✅' : '❌'}`);
    console.log(`  - 强制更新: ${config.forceUpdate ? '✅' : '❌'}`);
    console.log(`  - 批处理大小: ${config.batchSize}`);
    console.log(`  - 最大重试次数: ${config.maxRetries}\n`);

    collector = new DataCollector(dbManager.getRepositories(), config);

    // 3. 监听进度事件
    collector.on('progress', (progress) => {
      process.stdout.write(`\r${formatProgress(progress)}`);
    });

    // 4. 开始收集数据
    console.log('🔄 开始数据收集...\n');
    const result = await collector.collect();

    // 5. 显示结果
    console.log('\n\n📊 收集结果:');
    console.log(`  ✅ 总耗时: ${Math.round(result.duration / 1000)}s`);
    console.log(`  📦 收集的组件数: ${result.totalComponents}`);
    console.log(`  📄 收集的模板数: ${result.totalTemplates}`);
    
    if (Object.keys(result.componentsBySource).length > 0) {
      console.log('\n  📦 组件分布:');
      for (const [source, count] of Object.entries(result.componentsBySource)) {
        console.log(`    - ${source}: ${count} 个组件`);
      }
    }

    if (Object.keys(result.templatesBySource).length > 0) {
      console.log('\n  📄 模板分布:');
      for (const [source, count] of Object.entries(result.templatesBySource)) {
        console.log(`    - ${source}: ${count} 个模板`);
      }
    }

    if (result.errors.length > 0) {
      console.log('\n  ⚠️  错误信息:');
      result.errors.forEach(error => {
        console.log(`    - ${error}`);
      });
    }

    if (result.success) {
      console.log('\n🎉 数据收集完成!');
      process.exit(0);
    } else {
      console.log('\n❌ 数据收集失败!');
      process.exit(1);
    }

  } catch (error) {
    console.error('\n❌ 数据收集过程发生错误:', error);
    process.exit(1);
  } finally {
    // 清理资源
    if (collector) {
      collector.stop();
    }
    if (dbManager) {
      await dbManager.close();
      console.log('📊 数据库连接已关闭');
    }
  }
}

// 处理进程退出
process.on('SIGINT', () => {
  console.log('\n🛑 收到退出信号，正在停止数据收集...');
  process.exit(0);
});

process.on('SIGTERM', () => {
  console.log('\n🛑 收到终止信号，正在停止数据收集...');
  process.exit(0);
});

// 运行主函数
if (import.meta.url === `file://${process.argv[1]}`) {
  main().catch(console.error);
}